﻿#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <map>
using namespace std;
//#include "Vector.h"

//2.1 ｛｝初始化
struct Point {
	int _x;
	int _y;
};
//在C++98中，标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定
//int main() {
//	int array1[] = { 1, 2, 3, 4, 5 };
//	int array2[5] = { 0 };
//	Point p = { 1, 2 };
//
//	return 0;
//}



//C++11扩大了用大括号括起的列表(初始化列表)的使用范围，使其可用于
//所有的内置类型和用户自定义的类型，使用初始化列表时，可添加等号(=)，也可不添加。
class Date {
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day) {
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

//int main() {
//	int i = 0;
//	int j = { 0 };
//	int k{ 0 };
//
//	int array1[]{ 1, 2, 3, 4, 5 };
//	int array2[5]{ 0 };
//	Point p{ 1, 2 };
//
//	//创建对象时也可以使用列表初始化方式调用构造函数初始化
//	Date d1(2025, 07, 24); // old style
//	// C++11支持的列表初始化，这里会调用构造函数初始化
//	//本质是类型转换，用{}里的内容构造一个临时对象，再用临时对象去拷贝构造
//	//编译器优化为直接构造(构造+拷贝构造->优化直接构造)
//	Date d2 = { 2025, 07, 25 };
//	Date d3{ 2025, 07, 26 };
//	//Date& d4 = { 2025, 07, 27 };//不可以引用，因为临时对象具有常性
//	const Date& d4 = { 2025, 07, 27 };//const修饰才能引用常量
//
//	Date* p1 = new Date[3]{ d1,d2,d3 };
//	Date* p1 = new Date[3]{ {2025, 07, 24},{2025, 07, 25},{2025, 07, 26} };
//
//	return 0;
//}



//2.2 std::initializer_list
int main() {
	//Date属于多参数构造的类型转换，构造+拷贝构造->优化直接构造
	//需要和对应构造函数的参数个数匹配
	Date d1 = { 2025, 07, 24 };

	//这两种方式的初始化与上面Date初始化并不一样
	//它们{}中的参数个数可以是任意个数
	//这里{}中的参数是initializer_list
	vector<int> v1 = { 1,2,3,4 };
	vector<int> v2 = { 1,2,3,4,5,6 };
	list<int> lt = { 10,20,30 };

	//使用initializer_list赋值
	v1 = { 10,20,30,40, };

	// the type of il is an initializer_list
	auto il1 = { 10, 20, 30 };
	cout << typeid(il1).name() << endl;
	initializer_list<int> il2 = { 10,20,30,40 };
	initializer_list<int>::iterator it2 = il2.begin();
	while (it2 != il2.end()) {
		cout << *it2 << " ";
		++it2;
	}
	cout << endl;

	for (auto e : il2)
		cout << e << " ";
	cout << endl;

	//std::initializer_list 是 C++11 引入的一个轻量级模板类，用于支持列表初始化（uniform initialization），
	//即使用 { } 初始化对象。它使得初始化语法更加统一，并允许在构造函数或函数中接收任意长度的初始化列表。

	//vector支持initializer_list初始化的实现
	//vector(const initializer_list<T>&lt) {
	//	reserve(lt.size());
	//	for (auto& e : lt) push_back(e);
	//}

	return 0;
}
